package Baterias;

import Misil.MisilAliado;
import Entorno.Entorno;

/**
 * @brief Clase sobre la cual se tiene concurrencia. El monitor gestiona su uso.
 *        En principio, esta clase estaria terminada.
 * @author Marcelo
 * @version 1.1
 * @created 17-jul-2012 09:07:48 p.m.
 */
public class Bateria {
	//Campos de la clase Bateria
	private MisilAliado misilADisparar;
	private int tiempoRestante;
	public Entorno m_Entorno;
	public double[] ubicacion;
	private Monitor monitor;
	private int indice;

	/**
	 * @brief Constructor predeterminado. Requiere la ubicacion de la bateria y
	 *        una referencia al entorno.
	 * @param entorno
	 * @param ubicacion
	 */
	public Bateria(Entorno entorno, double[] ubicacion, int i) {
		tiempoRestante = 0;
		m_Entorno = entorno;
		indice = i;
		this.ubicacion = ubicacion;
	}

	/**
	 * @brief Funcion que devuelve el indice con el que se referencia esta
	 *        bateria en el monitor
	 * @return indice de esta bateria en el arreglo de baterias del entorno
	 */
	public int getIndice() {
		return indice;
	}

	/**
	 * @brief Funcion que carga un misil en la bateria. 
	 * @param misil
	 */
	public void cargarMisil(MisilAliado misil) {
		misil.setPosicion(this.getUbicacion());
		misilADisparar = misil;
	}

	/**
	 * @brief Funcion que dispara el misil actual asignado a la bateria.
	 * @return devuelve siempre verdadero, pero se agrego la posibilidad de
	 *         devolver falso en caso de error.
	 */
	public boolean Disparar() {
		if (misilADisparar == null)
			return false;

		m_Entorno.agregarMisilAliado(misilADisparar);

		misilADisparar.serLanzado();
		misilADisparar = null;
		System.out.println("La bateria ha lanzado un Misil");
		tiempoRestante = 30;
		return true;

	}

	/**
	 * @brief Funcion que devuelve el tiempo restante para que se habilite esta
	 *        bateria
	 * @return
	 */
	public int getTime() {
		return tiempoRestante;
	}

	/**
	 * @brief Funcion que devuelve la ubicacion de esta Bateria.
	 * @return ubicacion de esta bateria.
	 */
	public double[] getUbicacion() {
		double[] posicionADevolver = new double[ubicacion.length];
		System.arraycopy(ubicacion, 0, posicionADevolver, 0, ubicacion.length);
		return posicionADevolver;
	}

	/**
	 * @brief Funcion que pasa una referencia al monitor para esta bateria. El
	 *        mismo monitor es el encargado de hacer esto.
	 * @param monitor
	 */
	public void setMonitor(Monitor monitor) {
		this.monitor = monitor;
	}

	/**
	 * @brief Funcion que decrementa el tiempo restante. Si llega a cero se
	 *        habilita la bateria.
	 */
	public void decrementarTiempo() {
		try {
			if (tiempoRestante != 0) {
				tiempoRestante--;
				if (tiempoRestante == 0) {
					monitor.habilitarBateria(this);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}